$(document).ready(function(){
	
	// Sobreescreve as mensagens padrão do plugin
	jQuery.extend(jQuery.validator.messages, {
		required: "Campo obrigatório",
		email: "Informe um e-mail válido",
        url: "Informe uma URL válida.",
		number: "Informe somente números",
		digits: "Informe somente dígitos",
        date: "Informe uma data válida",
        maxlength: $.validator.format("Informe até {0} caracteres"),
		minlength: $.validator.format("Informe pelo menos {0} caracteres"),
		rangelength: $.validator.format("Informe de {0} a {1} caracteres"),
        min: $.validator.format("Informe um valor maior ou igual a {0}")
	});

	// Adicionar método de validação de CNPJ
	$.validator.addMethod("cnpj", function(value) {
		return validarCNPJ(value);
	}, 'Informe um CNPJ válido');

	// Adicionar método de validação de CNPJ
	$.validator.addMethod("cpf", function(value) {
		return validarCPF(value);
	}, 'Informe um CPF válido');

    $.validator.addMethod("dataBR", function(value) {
        return validaData(value);
    }, 'Informe uma Data válida');
});

function validaData(valor) {
    var date   = valor;
    var ardt   = new Array;
    var ExpReg = new RegExp("(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3}");

    ardt = date.split("/");
    erro = false;

    if ( date.search(ExpReg)==-1){
        erro = true;
    } else if (((ardt[1]==4)||(ardt[1]==6)||(ardt[1]==9)||(ardt[1]==11))&&(ardt[0]>30)) {
        erro = true;
    } else if ( ardt[1]==2) {
        if ((ardt[0]>28)&&((ardt[2]%4)!=0)){
            erro = true;
        }

        if ((ardt[0]>29)&&((ardt[2]%4)==0)){
            erro = true;
        }
    }

    if (erro) {
        return false;
    }

    return true;
}

function validarCPF(cpf) {
	cpf = cpf.replace(/[^\d]+/g,'');
	
	if(cpf == '') return false;
	
    // Elimina CPFs invalidos conhecidos
    if (cpf.length != 11 || 
    	cpf == "00000000000" || 
    	cpf == "11111111111" || 
    	cpf == "22222222222" || 
    	cpf == "33333333333" || 
    	cpf == "44444444444" || 
    	cpf == "55555555555" || 
    	cpf == "66666666666" || 
    	cpf == "77777777777" || 
    	cpf == "88888888888" || 
    	cpf == "99999999999")
    	return false;
    
    // Valida 1o digito
    add = 0;
    for (i=0; i < 9; i ++)
    	add += parseInt(cpf.charAt(i)) * (10 - i);
    rev = 11 - (add % 11);
    if (rev == 10 || rev == 11)
    	rev = 0;
    if (rev != parseInt(cpf.charAt(9)))
    	return false;
    
    // Valida 2o digito
    add = 0;
    for (i = 0; i < 10; i ++)
    	add += parseInt(cpf.charAt(i)) * (11 - i);
    rev = 11 - (add % 11);
    if (rev == 10 || rev == 11)
    	rev = 0;
    if (rev != parseInt(cpf.charAt(10)))
    	return false;
    
    return true;    
}

function validarCNPJ(cnpj) {
	cnpj = cnpj.replace(/[^\d]+/g,'');

	if(cnpj == '') return false;

	if (cnpj.length != 14)
		return false;

    // Elimina CNPJs invalidos conhecidos
    if (cnpj == "00000000000000" || 
    	cnpj == "11111111111111" || 
    	cnpj == "22222222222222" || 
    	cnpj == "33333333333333" || 
    	cnpj == "44444444444444" || 
    	cnpj == "55555555555555" || 
    	cnpj == "66666666666666" || 
    	cnpj == "77777777777777" || 
    	cnpj == "88888888888888" || 
    	cnpj == "99999999999999")
    	return false;

    // Valida DVs
    tamanho = cnpj.length - 2
    numeros = cnpj.substring(0,tamanho);
    digitos = cnpj.substring(tamanho);
    soma = 0;
    pos = tamanho - 7;
    for (i = tamanho; i >= 1; i--) {
    	soma += numeros.charAt(tamanho - i) * pos--;
    	if (pos < 2)
    		pos = 9;
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(0))
    	return false;

    tamanho = tamanho + 1;
    numeros = cnpj.substring(0,tamanho);
    soma = 0;
    pos = tamanho - 7;
    for (i = tamanho; i >= 1; i--) {
    	soma += numeros.charAt(tamanho - i) * pos--;
    	if (pos < 2)
    		pos = 9;
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(1))
    	return false;

    return true;    
}